<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>闭包</title>
    <style>
        .标注{
            color: red;
        }
    </style>
</head>
<body>
<p>
    概念：一个函数对周围状态的引用捆绑在一起，内层函数中访问到其外层函数的作用域 <br>
    简单理解：闭包 = (执行)内层函数 + (引用)外层函数的变量
</p>
<a href="https://www.bilibili.com/video/BV1Y84y1L7Nn/?p=155&spm_id_from=pageDriver&vd_source=cb928a955f1123af004a2e3158113ea7">
    视频教程, 主要看浏览器的调试
</a>
<p class="标注">
    看说明,根本看不懂. 这个教程里的说明 <br>
    我们python里也讲过闭包. 知道闭包的本质是什么就行, 这里重要是看下面闭包的代码怎么写
</p>
<hr>

<script>
    // 闭包的基本格式(写法)
    function 函数() {
        let a = 10 // 变量
        function 内函数() {
            console.log(a) // 内部函数， 调用外部函数 变量
        }
        return 内函数 // 外部函数的 返回值，是 内部函数
    }

    const 对象 = 函数() // 声明一个函数的 实例
    对象() // 函数相当于，把返回值给了 对象。  对象在执行 返回值，也就是 内函数


    // 案例：我们要做个统计函数调用次数，函数调用一次，就++
    function 统计() {
        let i = 0  // 这里的外层函数 变量，可以作为 内层函数的全局变量使用。 但是不能被外面的修改
        function 函数() {
            i++
            console.log(`函数被调用了${i}次`)  // 内层函数，调用外层函数 变量
        }

        return 函数 // 返回值是，内部的函数
    }

    const 调用次数 = 统计() // 创建，函数的示例
    调用次数() // 1
    调用次数() // 2
    调用次数() // 3

    const 调用次数2 = 统计() // 再次创建一个示例
    调用次数2() // 调用看看结果  1
</script>

</body>
</html>